//C17:17.5:list.c
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

static void CopyToNode(Item item, Node *pnode);

/*Initial List*/
void InitializeList(List *plist)
{
    *plist = NULL;
}

/*List is empty*/
bool ListIsEmpty(const List *plist)
{
    if(*plist == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/*List is Full*/
bool ListIsFull(const List *plist)
{
    Node *pt;
    bool full;

    pt = (Node*)malloc(sizeof(Node));
    if(pt == NULL)
    {
        full = true;
    }
    else
    {
        full = false;
    }
    free(pt);
    return full;
}

/*Count the item of List*/
unsigned int ListItemCount(const List *plist)
{
    unsigned int count = 0;
    Node *pnode = *plist;
    while (pnode != NULL)
    {
        ++count;
        pnode = pnode->next;
    }
    return count;
}

/*Add Item to List*/
bool AddItem(Item item, List *plist)
{
    Node *pnew;
    Node *scan = *plist;

    pnew = (Node*)malloc(sizeof(Node));
    if(pnew == NULL)
    {
        return false;
    }

    CopyToNode(item, pnew);
    pnew->next = NULL;

    if(scan == NULL)
    {
        *plist = pnew;
    }
    else
    {
        while (scan->next != NULL)
        {
            scan = scan->next;
        }
        scan->next = pnew;

    }
    return true;
}

/*Travel List*/
void Traverse(const List *plist, void(*pfun)(Item item))
{
    Node *pnode = *plist;
    while (pnode != NULL)
    {
        (*pfun)(pnode->item);
        pnode = pnode->next;
    }
}

/*Clear List*/
void EmptyTheList(List *plist)
{
    Node *psave;
    while (*plist != NULL)
    {
        psave = (*plist)->next;
        free(*plist);
        *plist = psave;
    }
}

static void CopyToNode(Item item, Node *pnode)
{
    pnode->item = item;
}